导航菜单
首页 >  数据库实验四 SQL查询  > 数据库实验三

数据库实验三

一、实验目的表或视图数据的各种查询(与统计)SQL命令操作,具体分为:①了解查询的概念和方法;②掌握SQL Server集成管理器查询子窗口中执行SELECT操作的方法;③掌握SELECT语句在单表查询中的应用;④掌握SELECT语句在多表查询中的应用;⑤掌握SELECT语句在复杂查询中的使用方法。二、实验内容(1)基于“教学管理”数据库jxgl,试用SQL的查询语句表达下列查询:①检索年龄大于23岁的男学生的学号和姓名;②检索至少选修一门课程的女学生姓名;③检索王同学不学的课程的课程号;④检索至少选修两门课程的学生学号;⑤检索全部学生都选修的课程的课程号与课程名;⑥检索选修了所有3学分课程的学生学号。(2)基于“教学管理”数据库jxgl,试用SQL的查询语句表达下列查询:①统计所有学生选修的课程门数;②求选修4号课程的学生的平均年龄;③求学分为3的每门课程的学生平均成绩;④统计每门课程的学生选修人数,超过3人的课程才统计,要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列;⑤检索学号比王非同学大,而年龄比他小的学生姓名;⑥检索姓名以王打头的所有学生的姓名和年龄;⑦在SC中检索成绩为空值的学生学号和课程号;⑧求年龄大于女同学平均年龄的男学生的姓名和年龄;⑨求年龄大于所有女同学年龄的男学生的姓名和年龄;⑩检索所有比“王华”年龄大的学生姓名、年龄和性别;⑪检索选修2号课程的学生中成绩最高的学生的学号;⑫检索学生姓名及其所选修课程的课程号和成绩;⑬检索选修4门以上课程的学生总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来。

(3)设有如下4个基本表(表结构与表内容是假设的),如表4-1、表4-2、表4-3、表4-4所示,请先创建数据库及根据表内容创建表结构,并添加表记录,实践以下各题的SQL命令操作:①查询选修课程“8105”且成绩在80到90之间的所有记录;②查询成绩为79,89或99的记录;③查询9803班的学生人数;④查询至少有20名学生选修的并以8开头的课程的平均成绩:⑤查询最低分大于80,最高分小于95的SNO与平均分:⑥查询9803班学生所选各课程的课程号及其平均成绩:⑦查询选修“8105”课程的成绩高于“9809”号同学成绩的所有同学的记录:⑧查询与学号为“9808”的同学同岁的所有学生的SNO、SNAME和AGE:⑨查询“钱军”教师任课的课程号,选修其课程学生的学号和成绩;⑩查询选修某课程的学生人数多于20人的教师姓名;⑪查询同学选修编号为“8105”课程且成绩至少高于其选修编号为“8245"课程的同学的SNO及“8105”课程成绩,并按成绩从高到低次序排列;⑫查询选修编号为“8105”课程且成绩高于所有选修编号为“8245”课程成绩的同学的CNO、SNO、GRADE;⑬列出所有教师和同学的姓名、SEX、AGE;⑭查询成绩比该课程平均成绩高的学生的成绩表;⑮列出所有任课教师的TNAME和DEPT;⑯列出所有未讲课教师的TNAME和DEPT;⑰列出至少有4名男生的班号;⑱查询不姓“张"的学生的记录;⑲查询每门课最高分的学生的SNO、CNO、GRADE;⑳查询与“李华”同性别并同班的同学的SNAME;㉑查询“女”教师及其所上的课程;㉒查询选修“数据库系统”课程的“男”同学的成绩表;㉓查询所有比刘涛年龄大的教师姓名、年龄和刘涛的年龄;㉔查询不讲授“8104”号课程的教师姓名。三、实验结果--1.1检索年龄大于23岁的男学生的学号和姓名;

select SNO,SNAMEfrom STUDENTwhere SAGE>23 AND SSEX = '男';--1.2检索至少选修一门课程的女学生姓名;

select SNAMEfrom STUDENT,SCwhere STUDENT.SNO=SC.SNOAND SSEX='女'group by SNAMEhaving count(Cno)>=1;

--1.3检索王同学不学的课程的课程号;

SELECT CnoFROM CourseWHERE Cno != ALL(SELECT Course.CnoFROM Student, SC,CourseWHERE (Sname LIKE '王%' AND Student.Sno = SC.Sno AND SC.Cno = Course.Cno));

--1.4检索至少选修两门课程的学生学号;

select SNOfrom SCgroup by SNOhaving count(Cno)>=2;

--1.5检索全部学生都选修的课程的课程号与课程名;

SELECT SC.CNO, CNAMEFROM COURSE left join SCon COURSE.CNO=SC.CNOGROUP BY SC.CNO, CNAMEHAVING COUNT()=(SELECT COUNT()FROM STUDENT);

--1.6检索选修了所有3学分课程的学生学号。

SELECT SNOFROM SCWHERE CNO IN (SELECT CNOFROM COURSEWHERE CCREDIT=3)GROUP BY SNOHAVING COUNT()=(SELECT COUNT()FROM COURSEWHERE CCREDIT=3);

--2.1统计所有学生选修的课程门数;

SELECT COUNT(DISTINCT CNO)'所有学生选修课的课程门数'FROM SC;

--2.2求选修4号课程的学生的平均年龄;

SELECT AVG(SAGE)'选修4号课程的学生的平均年龄'FROM SC,STUDENTWHERE STUDENT.SNO=SC.SNOAND CNO=4;

--2.3求学分为3的每门课程的学生平均成绩;

SELECT AVG(GRADE) '学分为3的每门课程的学生的平均成绩'FROM SC, COURSEWHERE SC.Cno = Course.Cno AND Course.Ccredit = 3;

--2.4统计每门课程的学生选修人数,超过3人的课程才统计,要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列;

SELECT CNO, COUNT(SNO) NumFROM SCGROUP BY CNOHAVING COUNT(SNO) > 3ORDER BY COUNT(SNO) DESC, CNO ASC;

--2.5检索学号比王非同学大,而年龄比他小的学生姓名;

SELECT SNAMEFROM STUDENTWHERE Sno > (SELECT Sno FROM Student WHERE Sname = '王非')AND Sage < (SELECT Sage FROM Student WHERE Sname = '王非');

--2.6检索姓名以王打头的所有学生的姓名和年龄;

SELECT SNAME,SAGEFROM STUDENTWHERE SNAME LIKE '王%';

--2.7在SC中检索成绩为空值的学生学号和课程号;

SELECT SNO,CNOFROM SCWHERE GRADE IS NULL;

--2.8求年龄大于女同学平均年龄的男学生的姓名和年龄;

SELECT SNAME, SAGEFROM StudentWHERE Ssex = '男' AND Sage > (SELECT AVG(Sage)FROM StudentWHERE Ssex = '女');

--2.9求年龄大于所有女同学年龄的男学生的姓名和年龄;

SELECT SNAME, SAGEFROM StudentWHERE Ssex = '男' AND Sage > ALL(SELECT SageFROM StudentWHERE Ssex = '女');

--2.10检索所有比“王华”年龄大的学生姓名、年龄和性别;SELECT SNAME, SAGE, SSEXFROM STUDENTWHERE Sage >(SELECT SageFROM StudentWHERE Sname = '王华');

--2.11检索选修2号课程的学生中成绩最高的学生的学号;

SELECT SNOFROM SCWHERE CNO=2AND GRADE=(SELECT MAX(GRADE)FROM SCWHERE CNO=2);

--2.12检索学生姓名及其所选修课程的课程号和成绩;

SELECT SNAME,CNO,GRADEFROM STUDENT,SCWHERE STUDENT.SNO=SC.SNO;

--2.13检索选修4门以上课程的学生总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来。

SELECT SUM(GRADE) '总成绩'FROM SCWHERE GRADE>=60GROUP BY SNOHAVING COUNT(CNO)>=4ORDER BY '总成绩' DESC;

--3.1查询选修课程“8105”且成绩在80到90之间的所有记录;

SELECT *FROM SCWHERE CNO='8105'AND GRADE between 80 and 90;

--3.2查询成绩为79,89或99的记录;

SELECT *FROM SCWHERE GRADE IN(79,89,99);

--3.3查询9803班的学生人数;

SELECT COUNT(*) '人数'FROM STUDENTWHERE CLASS='9803'

--3.4查询至少有20名学生选修的并以8开头的课程的平均成绩:

SELECT CNO,AVG(GRADE)AS 平均成绩FROM SCWHERE CNO LIKE '8%'GROUP BY CNOHAVING COUNT( DISTINCT SNO)>=20;

--3.5查询最低分大于80,最高分小于95的SNO与平均分;select SNO,avg(GRADE) 平均成绩from SCgroup by SNOhaving min(SC.GRADE) > 80 and max(SC.GRADE) (select gradefrom scwhere sno='9809');

--3.8查询与学号为“9808”的同学同岁的所有学生的SNO、SNAME和AGE;

select SNO,SNAME,AGEFROM STUDENTWHERE AGE IN(SELECT AGEFROM STUDENTWHERE STUDENT.SNO='9809');

--3.9查询“钱军”教师任课的课程号,选修其课程学生的学号和成绩;select SC.*from Course,TEACHER,SCWHERE Teacher.TNO = Course.TNOAND SC.CNO = Course.CNOAND Teacher.TNAME = '钱军'

--3.10查询选修某课程的学生人数多于20人的教师姓名;

select distinct Teacher.TNAMEfrom Teacher,COURSE,SCWHERE Course.TNO = Teacher.TNOAND Course.CNO = SC.CNOAND SC.CNO in(select SC.CNOfrom SCgroup by SC.CNOhaving count(*) > 20);

--3.11查询同学选修编号为“8105”课程且成绩至少高于其选修编号为“8245"课程的同学的SNO及“8105”课程成绩,并按成绩从高到低次序排列;

select SC.SNO,SC.GRADEfrom SCwhere SC.CNO = '8105'and SC.GRADE > (select GRADEfrom SC as S2where S2.SNO = SC.SNOand S2.CNO = '8245')order by SC.GRADE desc;

--3.12查询选修编号为“8105”课程且成绩高于所有选修编号为“8245”课程成绩的同学的CNO、SNO、GRADE;

select CNO,SC.SNO,GRADEfrom SCinner join Studenton Student.SNO = SC.SNOwhere SC.CNO = '8105'and SC.GRADE > (select max(SC.GRADE)from SCwhere SC.CNO = '8245');

--3.13列出所有教师和同学的姓名、SEX、AGE;

select Student.SNAME as 姓名,Student.SEX as 性别,Student.AGE as 年龄from Studentunionselect Teacher.TNAME as 姓名,Teacher.SEX as 性别,Teacher.AGE as 年龄from Teacher;

--3.14查询成绩比该课程平均成绩高的学生的成绩表;

select *from sc awhere a.grade not between 0 and (select avg(grade)from sc bwhere a.cno=b.cno);

--3.15列出所有任课教师的TNAME和DEPT;

select distinct Teacher.TNAME,Teacher.DEPTfrom Teacher,Coursewhere Course.TNO = Teacher.TNOand Course.TNO in (select distinct Course.TNOfrom Course);

--3.16列出所有未讲课教师的TNAME和DEPT;

select TNAME,DEPTfrom Teacherwhere Teacher.TNO not in (select Course.TNOfrom Course);

--3.17列出至少有4名男生的班号;

select Student.CLASSfrom Studentwhere SEX = '男'group by Student.CLASShaving count(*) >= 4;

--3.18查询不姓“张"的学生的记录;

select *from Studentwhere SNAME not like '张%'

--3.19查询每门课最高分的学生的SNO、CNO、GRADE;

select SNO,s1.CNO,GRADEfrom SC as s1where s1.GRADE IN (select max(s2.GRADE)from SC as s2where s1.CNO = s2.CNO);

--3.20查询与“李华”同性别并同班的同学的SNAME;

select SNAMEfrom Studentwhere Student.SEX = (select Student.SEXfrom Studentwhere Student.SNAME = '李华')and Student.CLASS = (select Student.CLASSfrom Studentwhere Student.SNAME = '李华');

--3.21查询“女”教师及其所上的课程;

select Teacher.TNAME,Course.CNO,Course.CNAMEfrom Teacherinner join Courseon Course.TNO = Teacher.TNOwhere Teacher.SEX = '女';

--3.22查询选修“数据库系统”课程的“男”同学的成绩表;

select distinct SC.SNO,Student.SNAME,Student.SEX,Course.CNAME,SC.GRADEfrom SCinner join Student on Student.SNO = SC.SNOinner join Course on Course.CNO = SC.CNOwhere Student.SEX = '男'and Course.CNAME = '数据库系统';

--3.23查询所有比刘涛年龄大的教师姓名、年龄和刘涛的年龄;

select Teacher.TNAME,AGE as 年龄from Teacherwhere AGE > (select AGEfrom Teacherwhere Teacher.TNAME = '刘涛')or Teacher.TNAME = '刘涛';

--3.24查询不讲授“8104”号课程的教师姓名。

select TNAMEfrom Teacherwhere TNAME not in(select TNAMEfrom Teacherjoin Courseon Course.TNO = Teacher.TNOwhere Course.CNO = '8104');

四、实验小结今天,我们进行了数据库的SQL语言-SELECT查询操作实验,主要学习了如何使用SELECT语句从数据库中查询数据。在实验过程中,我们实践了简单的SELECT查询、带有WHERE子句的查询以及使用AND和OR运算符的组合查询。

实验中,我们首先创建了一个简单的数据库表,并向其中插入了一些数据。接着,使用SELECT语句来查询表中的数据。刚开始,我们执行了一些简单的查询操作,例如查询所有列或特定列的数据。之后,我们学习了如何使用WHERE子句来筛选数据,包括使用比较运算符(如=、>、

相关推荐: